package test;
/***********************************************************************/
/* Copyright (c) 1999-2005, The Rector and Board of Visitors of the    */
/* University of Virginia.                                             */
/* All rights reserved.                                                */
/*                                                                     */
/* This program is being made available under the terms of version 2.1 */
/* of theGNU Lesser General Public License ("LGPL") as published as of */
/* February, 1999 by the Free Software  Foundation; and subject to the */
/* restrictions of the LGPL, you are authorized to  modify and/or      */
/* redistribute it.                                                    */
/*                                                                     */
/* As stated in the LGPL, THIS PROGRAM IS BEING MADE AVAILABLE "AS IS",*/
/* AND WITHOUT A WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,    */
/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF            */
/* MERCHANTABILITY AND  FITNESS FOR A PARTICULAR PURPOSE. FURTHER, YOU */
/* AGREE NOT TO HOLD THE COPYRIGHT  OWNER(S) LIABLE FOR DAMAGES,       */
/* INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,*/
/* ARISING OUT OF THE USE OR INABILITY TO USE  THE PROGRAM.            */
/* See the GNU General Public License for more details.                */
/*                                                                     */
/* You should have received a copy of version 2.1 of the GNU General   */
/* Public License along with this program; if not, you may obtain a    */
/* copy  from the Free Software Foundation website at the following URL*/
/* address (link  active as of September 1, 2005):                     */
/* http://www.fsf.org/licensing/licenses/lgpl.html; or that failing,   */
/* you can request a copy from Free Software Foundation,  Inc., 51     */
/* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.                */
/*                                                                     */
/* This program is part of the HyperCast software distribution. To     */
/* learn more about HyperCast, please visit the website at             */
/* http://www.hypercast.org.                                           */
/***********************************************************************/

/** HelloWorld_GlobalACK 
 *
 *       The HyperCast HelloWorld programs demonstrate various aspects of
 *       the HyperCast API.  The programs create an overlay socket that 
 *       sends and receives messages. 
 *
 *       The HelloWorld_GlobalACK program sends messages with E2EACK enabled. 
 *       This file corresponds to an example program in the HyperCast API description 
 *       (see Chapter:  "API - Advanced", Section: "1"). 
 * 
 *       The file is a bit more complex than the example in the chapter.
 *
 * @author HyperCast Team
 * @version 2005 (version 3.0)
 *
 */


import hypercast.*;
import hypercast.events.*;



public class HelloWorld_GlobalAck extends NotificationHandler implements  I_ReceiveCallback { 


	//	 The string we send 
	String MyString = new String("Hello World");

	//	 The overlay socket 
	I_OverlaySocket MySocket = null;

	//	 The configuration object
	HyperCastConfig ConfObj = null;
	    
	public static void main(String[] args) {
	    	
	   	// Create a new HelloWorld_CallBack instance 
	   	new HelloWorld_GlobalAck();
	}
	
	public void ReceiveCallback (I_OverlayMessage msg) {
		
		// Extract the payload and the logical address of the source
		//byte[] data = msg.getPayload();
	    String sMsg=new String(msg.getPayload(), 0, msg.getPayloadLength());
		
		/* get the logical address of the sender */
        String Src = msg.getSourceAddress().toString();

        // Print the payload (Skip messages sent by this program) 
        //if(!msg.getSourceAddress().equals(MySocket.getLogicalAddress()))
		 System.out.println("Received <"+ sMsg + ">from node with logical address: " +Src +" . ");
        //System.out.println("Received <"+ new String(data) + "> from logical address: " + Src + ".");
	  }
	
	public  HelloWorld_GlobalAck () {
		
		//	Create a configuration object
		ConfObj = HyperCastConfig.createConfig("hypercast.xml");
		
		// Create an overlay socket with the configuration object
		MySocket=ConfObj.createOverlaySocket(this, this);

		// Join the overlay network 
		MySocket.joinOverlay();

		// Print the logical address */ 
		String MyLogicalAddress = MySocket.getLogicalAddress().toString();
		System.out.println("Logical address is " + MyLogicalAddress + ".");
		
		// Repeat forever
		for(;;) {
			
			// wait 5 seconds 	
			try {
		        Thread.sleep(5000);
			} catch (InterruptedException e) {}	
			
			
			// Convert the string to a byte array and create a message
			byte[] MyData = MyString.getBytes(); 
			I_OverlayMessage MyMessage = MySocket.createMessage(MyData, I_OverlayMessage.E2EACK);
		 	
			// The message is sent to all members of the overlay //
			//MySocket.sendToAll(MyMessage);
			
			//The message is sent to a specified address (here: "9624,4704")
			I_LogicalAddress dest = MySocket.createLogicalAddress("9624,4704");	
			MySocket.sendToNode(MyMessage, dest);

			System.out.println("<HelloWorld> message sent to other members ..." );
		 }
	}
	
	public void handle_E2EACK_RECEIVED (E2EACK_RECEIVED event) {
	 	byte[] MsgID = (byte []) event.getInfo();
	 	System.out.println("Message  " + MsgID.toString() + " is  acknowledged");
	  }

	  public void handle_E2EPARTIALACK_RECEIVED (E2EPARTIALACK_RECEIVED event) {
	  	byte[] MsgID = (byte []) event.getInfo();
	 	System.out.println("Message " + MsgID.toString()+ " partially  acknowledged");
		
	 	//Redo with different message ID;
	 	String MyString = new String("Hello World");
		I_OverlayMessage msg =  
	 		 	MySocket.createMessage(MyString.getBytes(), I_OverlayMessage.E2EACK);
	 	MySocket.sendToAll(msg);
	  }
}

